package com.ftg.learn.chapter11.annotation;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.math.BigDecimal;

/**
 * 商品实例
 *
 * @author 布衣
 */
@Data
@ToString
//组件化注解  把这个类id="pro"的形式注入容器里面
@Component("pro")
/**
 * 可以根据不能的业务类进行划分
 * 没办法区分业务使用  Component
 *  @Repository 用来修饰一个类，完成实例化操作，但是这个类叫做数据操纵类
 *  @Service    用来修饰一个类，完成实例化操作, 但是这个类叫做业务逻辑类
 *  @Controller 用来修饰一个类，完成实例化操作, 但是这个类叫做控制器类 [同步开发模式]
 *      @RestController 用来修饰一个类，完成实例化操作, 但是这个类叫做控制器类 [异步开发模式]
 *  @Mapper   用来修饰一个类，完成实例化操作，但是这个类叫做数据操纵类(只当使用mybatis框架时调用)
  */
//@Autowired : 只能用在属性和方法上面，所以自动装配一个类的实例(容器里面)给当前变量
//声明当前这个类的 实例化方式为单例
@Scope("prototype")
//实例化顺序
@Order(1)
//懒加载
@Lazy
//主要的，表示有多个实例的时候，只给这个
@Primary
//依赖，实例化product以前要实例工厂
@DependsOn("productFactory")
public class ProductEntity {

    public ProductEntity(){
        System.out.println("我实例化了");
    }

    @PostConstruct
    @PreDestroy
    public void test1(){
        System.out.println("我不是构造方法，便是你实例的时候我也要走一下，在实例化以后自动执行一次");
    }

    private Integer sno;

    @Value("苹果")
    private String name;

    private BigDecimal price;

}
